using System;
using System.Collections.Generic;

namespace GraphSpace
{
	public class SZKomponenten
	{
		List<List<Knoten>> komponenten;							// die starken Zusammenhangskomponenten

		public SZKomponenten ()
		{
			komponenten = new List<List<Knoten>>();
		}
		
		public void berechneKomponenten(oldGraph G)
		{
			GraphScanning GS = new GraphScanning();				// Algorithmus zum einfachen Scannen des Graphen mit Tiefensuche
			List<int> unmarkierte_knoten = new List<int>();		// Liste aller unmarkierten Knoten
			
			G.resetV();											// Markierungen aller Knoten des Graphen zurück setzen						
			
			foreach(Knoten v in G.V)						// alle Knoten als unmarkiert deklarieren
				unmarkierte_knoten.Add(v.Id);
			
			while(unmarkierte_knoten.Count!=0)					// solange es noch unmarkierte Knoten gibt
			{
				GS.starteTiefensuche(G, unmarkierte_knoten[0]);	// Tiefensuche am einem unmarkierten Knoten starten
				foreach(Knoten v in GS.R)
					unmarkierte_knoten.Remove(v.Id);			// alle neu erreichten Knoten aus der Liste der unmarkierten entfernen
			}
			
			// die Abarbeitungszeiten der Knoten nach der einfachen Tiefensuche sichern
			List<int> Knoten_absteigend = new List<int>(GS.Knoten_absteigend);	
			GS.reset();											// Den Graph-Scanning-Algorithmus zurück setzen;
			G.resetV();											// Markierungen aller Knoten des Graphen zurück setzen
			
			// Tiefensuche rückwärts
			//while(Knoten_absteigend.Count!=0)
			//{
			//	int s = Knoten_absteigend[0];
			//	GS.starteTiefensuche_rückwärts(G, s);
			//	foreach(Knoten v in GS.R)						// besuchte Knoten als Startknoten ausschließen
			//		Knoten_absteigend.Remove(v.Id);
			//	komponenten.Add(new List<Knoten>(GS.R));		// Komponente sichern
			//}
		}
		
		public List<List<Knoten>> Komponenten
		{
			get{return this.komponenten;}
		}
	}
}
